package com.ptms.controller;

import com.ptms.entity.User;
import com.ptms.service.UserService;
import com.ptms.vo.ResultVO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.web.bind.annotation.*;

import com.ptms.dto.PasswordChangeDTO;
import jakarta.validation.Valid;

@RestController
@RequestMapping("/user") // 结合 yml 中 context-path: /api，最终接口路径为 /api/user
public class UserController {

    @Autowired
    private UserService userService;

    /**
     * 1. 获取当前登录用户信息（匹配前端 fetchCurrentUserInfo 方法）
     * 请求方式：GET
     * 接口路径：/api/user/info（无参）
     * 原理：从 Security 上下文获取 JWT 解析后的用户名
     */
    @GetMapping("/info")
    public ResultVO<User> getCurrentUserInfo() {
        // 获取当前登录用户名（JwtAuthenticationFilter 已将用户信息存入 Security 上下文）
        String username = getCurrentUsername();
        // 调用 Service 层获取用户信息
        return userService.getCurrentUser(username);
    }





    /**
     * 3. 更新用户信息（匹配前端 updateUserInfo 方法）
     * 请求方式：PUT
     * 接口路径：/api/user/update
     * 请求体：前端传递的 newUserInfo（JSON 格式）
     */
    @PutMapping("/update")
    public ResultVO<User> updateUserInfo(@RequestBody User updateInfo) {
        // 获取当前登录用户名（确保只能更新自己的信息）
        String username = getCurrentUsername();
        return userService.updateCurrentUser(username, updateInfo);
    }

    @PostMapping("/change-password")
    public ResultVO<Void> changePassword(@Valid @RequestBody PasswordChangeDTO passwordChangeDTO) {
        // 获取当前登录用户名（确保只能修改自己的密码）
        String username = getCurrentUsername();
        // 调用Service层执行密码修改逻辑
        return userService.changeUserPassword(username, passwordChangeDTO);
    }
    /**
     * 5. 查询所有角色为学生的数据
     * 请求方式：GET
     * 接口路径：/api/user/students
     */
    @GetMapping("/students")
    public ResultVO<java.util.List<User>> getAllStudents() {
        return userService.getAllStudents();
    }

    /**
     * 6. 根据校区ID查询相同校区的学生数据
     * 请求方式：GET
     * 接口路径：/api/user/students/campus
     */
    @GetMapping("/students/campus")
    public ResultVO<java.util.List<User>> getStudentsByCampusId(
            @RequestParam("campusId") Long campusId) {
        return userService.getStudentsByCampusId(campusId);
    }
    /**
=======

    /**
>>>>>>> origin/master
     * 工具方法：从 Security 上下文提取当前登录用户名
     */
    private String getCurrentUsername() {
        Object principal = SecurityContextHolder.getContext().getAuthentication().getPrincipal();
        if (principal instanceof UserDetails) {
            // 正常情况：principal 是 UserDetails 实例，直接获取用户名
            return ((UserDetails) principal).getUsername();
        } else {
            // 异常情况：principal 是字符串（如匿名用户），直接返回
            return principal.toString();
        }
    }
}